第一次學習 Shell Script - 隨手記


Posted by krebikshaw on 2020-06-14

以下操作皆以 Command Line 來執行

如何執行 Shell Script 的檔案

chmod +x <檔案名稱>:這一步是讓檔案可以執行, x 表示可執行的意思

  • chmod是變更檔案屬性。

./<檔案名稱>:再輸入這一行指令

實際執行的樣子:

Shell Script 上的變數

MY_NAME="krebikshaw"
  • 注意,在 前後是不能有空格的喔!

實際的內容長這樣

#!/bin/bash
MY_NAME="krebikshaw"
echo "My name is $MY_NAME"
  • #!/bin/bash :這行是代表bash 在 /bin/ 下面,因為我們是以 bash shell 當作範例
  • echo : 表示將資料列印在畫面上
  • $:當我們要使用變數時,就必須要在變數前面加上 $ 符號

從 Command Line 執行 Shell Script

  • cat 就是 Command Line 的指令,可以查看 test1.sh 的內容

在舉第二個例子

#!/bin/bash
echo -n "你好!請輸入你的年齡:"
read AGE
echo "你輸入的年齡是 $AGE 歲"

Shell Script 的判斷式

# 如果判斷式為真,就執行 do something 1
if [ 判斷式 ]; then
  do something 1
fi

# 如果判斷式為真,就執行 do something 1, 否則就執行 do something 2
if [ 判斷式 ]; then
  do something 1
else
  do something 2
fi

# 如果判斷式為真,就執行 do something 1, 為假往下執行看 判斷式2 是否為真
# 為真就執行 do something 2, 否則就執行 do something 3
if [ 判斷式 ]; then
  do something 1
elif [ 判斷式2 ]; then
  do something 2
else
  do something 3
fi
  • if 開頭,以 fi 結尾
  • elif 就是 else if 的意思

將上面的範例加上判斷式

#!/bin/bash

echo -n"你好!請輸入你的年齡:"
read AGE

if [ $AGE -eq 18 ]; then
  echo "恭喜你,你剛滿 18 歲"
elif [ $AGE -lt 18 ]; then
  echo "你還未成年喔!"
else 
  echo "你已經成年了!"
fi

echo "你輸入的年齡是 $AGE 歲"

-eq, -lt 的意思如下

  • -eq:等於
  • -ne:不等於
  • gt:大於
  • ge:大於等於
  • lt:小於
  • le:小於等於

Command Line 的執行結果

debug 方式可以參考這篇

Shell Script 的迴圈

  1. 第一種迴圈表示方式:

    While [ condition ]
    do
     command1
     command2
     …
    done
    

    當 condition 為 true 就會執行 do 的內容。

  2. 第二種迴圈表示方式:

    for ((起始條件; 終止條件; 每一圈要做的事))
    do 
      ......
    done
    
  3. 第三種迴圈表示方式:

    for keyword in name like blog 
    do 
      ......
    done
    
    • 把 keyword 分別用 name, like, blog 三個參數帶入,並且執行。
    • 也就是一共會執行三圈的迴圈

Shell Script 的函式

function_name() {  // 一個叫做 function_name 的函式
   內容
}

function_name  // 呼叫函式

綜合練習

題目:
寫一個 shell script,可以傳入一個數字 n,然後會產生 1~n 個檔案,檔名是 {number}.js。 (舉例來說:./num.sh 10會產生1.js、2.js...10.js。)

  • 我們來把解題流程寫下來
    1. 接收使用者所輸入的參數 n
    2. 建立一個 1 ~ n 的迴圈
    3. 每一圈要建立一個新的檔案叫做 {number}.js
#!/bin/bash

for ((i=1; i<=$1; i++))
do
    touch "$i.js"
done

echo "建立檔案完成!"

進階運用 - 用 Shell Script 處理字串

awk -F'<要切開的標的物>''{print $1}'

  • 把字串用 <標的物> 切開後,取第一塊

實際案例:

#!/bin/bash

MY_NAME="Peter:123456:man"

echo $MY_NAME | awk -F':' '{print $1}'

echo $MY_NAME | awk -F':' '{print $2}'

echo $MY_NAME | awk -F':' '{print $3}'
  1. 有一個 MY_NAME 字串,內容是 Peter:123456:man
  2. 我把字串用 : 切開,會切成三塊 Peter, 123456, man
  3. {print $1} 可以取出第一塊 Peter
  • 執行後會長這樣:

我們把字串處理結合實際案例

先給你一個 api 資料,只要下指令 curl https://api.github.com/users/ 加上帳號,就可以看到這個帳號的個人資訊

(以 Huli 老師的個人資訊作為範例,如下圖)

接著我們試著從這份資料上取得 Huli 老師的:

  1. name :姓名
  2. bio :興趣
  3. location :地點
  4. blog :部落格連結
#!/bin/bash

curl -silent https://api.github.com/users/$1 > temp.txt

for keyword in name bio location blog
do
    grep -e $keyword temp.txt | awk -F'"' '{print $4}'
done
  1. curl -silent 指令去抓,GitHub 上的個人資料,並寫進一個 temp.txt
  2. 利用迴圈,將 keyword 分別用 name, bio, location, blog 帶入後執行
  3. 把 存放在 temp.txt 的 keyword grep 出來
  4. 利用 awk -F 指令,把資料從 " 切開,並取得切開後的第四塊資料

我們來看看執行的結果吧:

參考資料:
[第一週] Shell Script 腳本
快快樂樂學會讓電腦幫我做事
shell script的 字串處理,取代符號的用法,awk 以及 sed


#shell script







Related Posts

What Type of Laser Engraving Machine Should be Used for Stainless Steel Engraving?

What Type of Laser Engraving Machine Should be Used for Stainless Steel Engraving?

白飯之亂影響北科大的搜尋量

白飯之亂影響北科大的搜尋量

版本控制 - GitHub實作

版本控制 - GitHub實作


Comments